// 普通装饰器
// function logClass(params:any){
//   console.log(params);
//   params.prototype.apiUrl = "动态拓展的属性";
//   params.prototype.run = () => {
//     console.log("动态拓展的方法")
//   }
// }
// @logClass
// class HttpClient{
//   constructor(){

//   }
//   getData(){
    
//   }
// }
// let http = new HttpClient();
// console.log(http.apiUrl);
// http.run();

// 装饰器工厂
// function logClass(params:string){
//   return (target:any) => {
//     console.log(target);
//     console.log(params);
//     target.prototype.apiUrl = params;
//   }
// }
// @logClass("http://www.baidu.com")
// class HttpClient{
//   constructor(){

//   }
//   getData(){
    
//   }
// }
// let http = new HttpClient();
// console.log(http.apiUrl);
// http.run();

// 类装饰器
// let logClass = (target:any) => {
//   console.log(target)
//   return class extends target{
//     apiUrl:any = "修改后的数据";
//     getData(){
//       this.apiUrl = this.apiUrl + '-----'
//       console.log(this.apiUrl)
//     }
//   }
// }
// // 属性装饰器
// let logProperty = (params:any){
//   return (target:any, attr:any) => {
//     console.log('target---', target);
//     console.log('attr---', attr);
//     target[attr] = params;
//   }
// }
// @logClass
// class HttpClient{
//   @logProperty("http://www.sohu.com")
//   public apiUrl:string | undefined
//   constructor(){
//     this.apiUrl = "构造函数中的apiUrl"
//   }
//   getData(){
//     console.log(this.apiUrl)
//   }
// }
// let http = new HttpClient();
// http.getData();

// 方法装饰器
// let logMethod = (params:any) => {
//   return (target:any, methodName:any,desc:any) => {
//     console.log(target);
//     console.log(methodName);
//     console.log(desc);  //对应类中的方法==》getData()
//     console.log(desc.value);
//     target.apiUrl = "xxx";
//     target.run = () => {
//       console.log("run")
//     }
    
//   }
// }
// class HttpClient{
//   public apiUrl:string | undefined
//   constructor(){
//   }
//   @logMethod("http://www.itying.com")
//   getData(){
//     console.log(this.apiUrl)
//   }
// }
// let http = new HttpClient();
// console.log(http.apiUrl);
// http.run();

// 方法装饰器修改类中的方法
let logMethod = (params:any) => {
  return (target:any, methodName:any,desc:any) => {
    console.log(target);
    console.log(methodName);
    console.log(desc);  //对应类中的方法==》getData()
    console.log(desc.value);
    target.apiUrl = "xxx";
    target.run = () => {
      console.log("run")
    }
    let oMethod = desc.value;
    desc.value = (...args:any[]) => {
      args = args.map((value)=>{
        return String(value);
      })
      oMethod.apply(this, args);
    }
  }
}
class HttpClient{
  public apiUrl:string | undefined
  constructor(){
  }
  @logMethod("http://www.itying.com")
  getData(...args:any[]){
    console.log(args)
    console.log("我是getData中的方法");
  }
}
let http = new HttpClient();
http.getData(123, "xzxxxxx");

// 方法参数装饰器
